package com.ssm.redis.init;

import com.ssm.tool.SpringContextUtil;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;
import java.util.Map;
import java.util.Map.Entry;

@Component
@ConditionalOnProperty(name = {"init.cache.enable"}, havingValue = "true") //符合规则的模块才预热数据
public class initCache implements CommandLineRunner {

    @Override
    public void run(String... args) throws Exception { //项目启动后会立即执行该方法(数据初始化、发送通知或者执行一些定时任务)

        //预热数据，抽象类AbstractCache有实现类，利用SpringContextUtil获取AbstractCache类的所有实现类，遍历即可

        ApplicationContext applicationContext = SpringContextUtil.getApplicationCtxt();

        //getBeansOfType获取一个接口下所有实现类
        Map<String, AbstractCache> beansMap = applicationContext.getBeansOfType(AbstractCache.class);

        if(!beansMap.isEmpty()) {
            for(Entry<String, AbstractCache> bean : beansMap.entrySet()) {
                // 获取AbstractCache的子类(实现缓存方法的类)，并调用其initCache()方法
                AbstractCache abstractCache = (AbstractCache) SpringContextUtil.getBean(bean.getValue().getClass());
                abstractCache.initCache();
            };
        }

        System.out.println("缓存成功....");
    }
}
